﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace Tarea3_Virginia_Opazo
{
    public partial class AplicacionGestionHH : Form
    {

        private AccesoBD acceso;
        private BindingSource fuenteEspecialidades;
        private bool EsTexto;
        private bool primeraVisita = true;
        private bool primeraVisitaCombo = true;
        private bool primeraVisitaVinc = true;
        private List<int> listaVinculacion;
        private Dictionary<int, List<string>> aVincular;
        private Dictionary<int, List<string>> aDesvincular;
        private List<int> listaDesvinculacion;
        private string idTrabajadorEditando;
        private int filaEditando;
        private bool NoEsNumero;

        public AplicacionGestionHH()
        {
            InitializeComponent();
            acceso = new AccesoBD();
            bool conectado=acceso.Conectar();
            if (!conectado)
            {
                MessageBox.Show("No fue posible realizar la conexión a la Base de Datos. Favor verifique la conexión y reintente abrir la aplicación.");
                this.Enabled = false;
            }
            else
            {
                
                
                LlenarDataGridTrabajadores();
                LlenarComboBoxEspecialidadTrabajador();
                
            }
            
        }
        
        /// <summary>
        /// Dirige el registro de un nuevo trabajor
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonGuardarTrabajador_Click(object sender, EventArgs e)
        {
            string nombre = String.IsNullOrEmpty(textBoxNombreTrabajador.Text) ? null : textBoxNombreTrabajador.Text;
            string apellido = String.IsNullOrEmpty(textBoxApellidoTrabajador.Text) ? null : textBoxApellidoTrabajador.Text;
            string idEspecializacion = comboBoxEspecialidadTrabajador.SelectedItem==null? null : comboBoxEspecialidadTrabajador.SelectedValue.ToString();

            if (nombre == null || apellido == null)
            {
                MessageBox.Show("Favor ingrese el nombre y apellido del empleado.");
                return;
            }

            int inserciones = acceso.EjecutarInsertUpdateDelete(Consultas.InsertarTrabajador(nombre, apellido, idEspecializacion));
            if (inserciones > 0)
            {
                
                LlenarDataGridTrabajadores();
                MessageBox.Show("Trabajador ingresado correctamente.");
            }
            else
            {
                MessageBox.Show("Existen problemas en la conexión. No fue posible ingresar el trabajador.");
            }
            ClearIngresoTrabajador();


        }

        /// <summary>
        /// Ordena el ingreso a la base de datos de una nueva especialización.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonAgregarEspecialidad_Click(object sender, EventArgs e)
        {
            string mensaje="";
            int insercion = acceso.EjecutarInsertUpdateDelete(Consultas.InsertarEspecialidad(textBoxEspecialidad.Text));
            if (insercion >= 0)
            {
                ObtenerDatosEspecialidad();
                ClearIngresoEspecialidad();
                mensaje = "La especialidad fue ingresada con éxito";
                
                
            }
            else
            {
                mensaje = "Error en el ingreso";
            }
            MessageBox.Show(mensaje);
        }
        
        /// <summary>
        /// Maneja el click en la celda para eliminar una especialidad
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewEspecialidades_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                int idEspecialidad = (Int32)dataGridViewEspecialidades[1, e.RowIndex].Value;
                bool eliminacionExitosa = BorrarEspecialidad(idEspecialidad);
                if (eliminacionExitosa)
                {
                    LlenarComboBoxEspecialidadTrabajador();
                }
            }
            
        }

        /// <summary>
        /// Maneja la orden de eliminar un trabajador
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewTrabajadores_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                int idTrabajador = (Int32)dataGridViewTrabajadores[1, e.RowIndex].Value;
                DataTable resultado = acceso.EjecutarSelect(Consultas.EsJefeDeProyecto(idTrabajador));
                if (resultado == null)
                {
                    MessageBox.Show("Error de Conexion.");
                    return;
                }
                else
                {
                    if (resultado.Rows.Count == 0)
                    {
                        bool eliminacionExitosa = BorrarTrabajador(idTrabajador);
                    }
                    else
                    {
                        MessageBox.Show("El trabajador es jefe de proyecto. No es posible eliminarlo.");
                    }
                }
            }
            
            
        }

        /// <summary>
        /// Maneja la orden de crear un nuevo proyecto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonGuardarProyecto_Click(object sender, EventArgs e)
        {

            string nombreProyecto = String.IsNullOrEmpty(textBoxNombreProyecto.Text) ? null : textBoxNombreProyecto.Text;
            string idTrabajadorJefe = comboBoxJefeProyecto.SelectedItem == null ? null : comboBoxJefeProyecto.SelectedValue.ToString();

            if (nombreProyecto == null || idTrabajadorJefe == null)
            {
                MessageBox.Show("Por favor complete todos los campos pedidos.");
                return;
            }

            int inserciones = acceso.EjecutarInsertUpdateDelete(Consultas.InsertarProyecto(idTrabajadorJefe, nombreProyecto));
            if (inserciones >= 0)
            {
                LlenarDataGridProyecto();
                MessageBox.Show("Proyecto ingresado correctamente.");
            }
            else
            {
                MessageBox.Show("Error en la conexión. No fue posible ingresar el proyecto.");
            }
            ClearIngresoProyecto();
        }

        /// <summary>
        /// Maneja la orden de Borrar un proyecto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewProyectos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                int idProyecto = (Int32)dataGridViewProyectos[1, e.RowIndex].Value;
                bool eliminacionExitosa = BorrarProyecto(idProyecto);
                if (eliminacionExitosa)
                {

                }
            }
        }

        /// <summary>
        /// Maneja la seleccion de distintas pestañas de la aplicacion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int i = ((TabControl)sender).SelectedIndex;
            switch (i)
            {
                case 0:
                    LlenarComboBoxEspecialidadTrabajador();
                    LlenarDataGridTrabajadores();
                    break;
                case 1:
                    CargarComboJefesProyecto();
                    LlenarDataGridProyecto();
                    break;
                case 2:
                    ObtenerDatosEspecialidad();
                    break;
                case 3:
                    LlenarDataGridHorasLibres();
                    CargarComboboxProyectos();
                    dataGridViewTrabajadoresHorasLibres.ClearSelection();
                    listaVinculacion = new List<int>();
                    aVincular = new Dictionary<int, List<string>>();
                    primeraVisita = false;
                    break;
                default: break;
            }

        }

        

        #region Utilidades Especialidad
        private void ObtenerDatosEspecialidad()
        {
            string mensaje = "";
            DataTable resultado = acceso.EjecutarSelect(Consultas.SeleccionarEspecialidades());
            if (resultado == null)
            {
                mensaje = "Existen problemas en la conexión a la Base de Datos. No fue posible actualizar lista de Especialidades";
                MessageBox.Show(mensaje);
            }
            else
            {
                dataGridViewEspecialidades.DataSource = resultado;
                dataGridViewEspecialidades.Columns["IdEspecializacion"].Visible = false;
                dataGridViewEspecialidades.Columns["NombreEspecializacion"].HeaderText = "Especialidad";
            }
            

           
        }

        private bool BorrarEspecialidad(int idEspecialidad)
        {
            string mensaje = "";
            
            int cantidadEliminados = acceso.EjecutarInsertUpdateDelete(Consultas.BorrarEspecialidad(idEspecialidad));
            if (cantidadEliminados >= 0)
            {
                mensaje="La especialidad fue eliminada correctamente.";
                ObtenerDatosEspecialidad();
                MessageBox.Show(mensaje);
                return true;
            }
            else
            {
                mensaje = "Existen problemas en la conexión. No fue posible realizar su solicitud.";
                MessageBox.Show(mensaje);
                return false;
            }
            
        }

        private void ClearIngresoEspecialidad()
        {
            textBoxEspecialidad.Clear();
        }
        #endregion

        #region Utilidades Trabajador
        private void LlenarComboBoxEspecialidadTrabajador()
        {
            DataTable resultado = acceso.EjecutarSelect(Consultas.SeleccionarEspecialidades());
            if (resultado == null)
            {
                MessageBox.Show("Error de Conexión");
                return;
            }
            else
            {
                comboBoxEspecialidadTrabajador.DataSource = resultado;
                comboBoxEspecialidadTrabajador.DisplayMember = "NombreEspecializacion";
                comboBoxEspecialidadTrabajador.ValueMember = "IdEspecializacion";
                comboBoxEspecialidadTrabajador.SelectedItem = null;
            }

            
        }

        private void LlenarDataGridTrabajadores()
        {
            string mensaje = "";
            DataTable resultadoTrabajadores = acceso.EjecutarSelect(Consultas.obtenerListaTrabajadores());
            if (resultadoTrabajadores == null)
            {
                mensaje = "Existen problemas en la conexión a la Base de Datos. No fue posible actualizar lista de Trabajadores.";
                MessageBox.Show(mensaje);
            }
            else
            {
                dataGridViewTrabajadores.DataSource = resultadoTrabajadores;
                dataGridViewTrabajadores.Columns["IdTrabajador"].Visible = false;
                dataGridViewTrabajadores.Columns["IdEspecializacion_Trabajador"].Visible = false;
                dataGridViewTrabajadores.Columns["NombreTrabajador"].Visible = false;
                dataGridViewTrabajadores.Columns["ApellidoTrabajador"].Visible = false;
                dataGridViewTrabajadores.Columns["NombreCompletoTrabajador"].HeaderText = "Nombre";
                dataGridViewTrabajadores.Columns["NombreEspecializacion"].HeaderText = "Especialización";
            }
                       
        }

        private void ClearIngresoTrabajador()
        {
            textBoxNombreTrabajador.Clear();
            textBoxApellidoTrabajador.Clear();
            comboBoxEspecialidadTrabajador.SelectedItem = null;
        }

        private bool BorrarTrabajador(int idTrabajador)
        {
            string mensaje="";
            int cantidadEliminados = acceso.EjecutarInsertUpdateDelete(Consultas.BorrarTrabajador(idTrabajador));
            if (cantidadEliminados >= 0)
            {
                mensaje = "El trabajador fue eliminado correctamente.";
                LlenarDataGridTrabajadores();
                MessageBox.Show(mensaje);
                return true;
            }
            else
            {
                mensaje = "Existen problemas en la conexión. No fue posible realizar su solicitud.";
                MessageBox.Show(mensaje);
                return false;
            }
            
        }

        #endregion

        #region Utilidades Proyecto
        private void CargarComboJefesProyecto()
        {
            DataTable resultado = acceso.EjecutarSelect(Consultas.obtenerListaTrabajadores());
            if (resultado == null)
            {
                MessageBox.Show("Error de conexión.");
                return;
            }
            else
            {
                comboBoxJefeProyecto.DataSource = resultado;
                comboBoxJefeProyecto.ValueMember = "IdTrabajador";
                comboBoxJefeProyecto.DisplayMember = "NombreCompletoTrabajador";
                comboBoxJefeProyecto.SelectedItem = null;
            }
        }

        private void ClearIngresoProyecto()
        {
            textBoxNombreProyecto.Clear();
            comboBoxJefeProyecto.SelectedItem = null;
        }

        private void LlenarDataGridProyecto()
        {
            string mensaje = "";
            DataTable informacionProyectos = acceso.EjecutarSelect(Consultas.obtenerListaProyectos());
            if (informacionProyectos == null)
            {
                mensaje = "Existen problemas en la conexión a la Base de Datos. No fue posible actualizar lista de Proyectos.";
                MessageBox.Show(mensaje);
            }
            else
            {
                dataGridViewProyectos.DataSource = informacionProyectos;
                dataGridViewProyectos.Columns["IdProyecto"].Visible = false;
                dataGridViewProyectos.Columns["IdTrabajador_Jefe"].Visible = false;
                dataGridViewProyectos.Columns["NombreProyecto"].HeaderText = "Nombre Proyecto";
                dataGridViewProyectos.Columns["NombreCompletoTrabajador"].HeaderText = "Nombre Trabajador";
                dataGridViewProyectos.Columns["NombreEspecializacion"].HeaderText = "Especialidad";
            }
        }

        private bool BorrarProyecto(int idProyecto)
        {
            string mensaje = "";
            
            int cantidadEliminados = acceso.EjecutarInsertUpdateDelete(Consultas.BorrarProyecto(idProyecto));
            if (cantidadEliminados >= 0)
            {
                mensaje = "El Proyecto fue eliminado correctamente.";
                LlenarDataGridProyecto();
                MessageBox.Show(mensaje);
                return true;
            }
            else
            {
                mensaje = "Existen problemas en la conexión. No fue posible realizar su solicitud.";
                MessageBox.Show(mensaje);
                return false;
            }
        }
        #endregion

        #region Utilidades Vincular Trabajador
        private void LlenarDataGridHorasLibres()
        {
            string mensaje = "";
            DataTable resultado = acceso.EjecutarSelect(Consultas.HorasXTrabajador());
            if (resultado == null)
            {
                mensaje = "Existen problemas en la conexión a la Base de Datos. No fue posible actualizar lista.";
                MessageBox.Show(mensaje);
            }
            else
            {
                List<string> idTrabajadoresOcupados = new List<string>();
                List<DataRow> filasABorrar = new List<DataRow>();
                foreach (DataRow row in resultado.Rows)
                {
                    if (Double.Parse(row["Horas"].ToString()) < 0)
                    {
                        idTrabajadoresOcupados.Add(row[1].ToString());
                        filasABorrar.Add(row);
                    }
                }
                foreach (DataRow row in filasABorrar)
                {
                    resultado.Rows.Remove(row);
                }
                if (idTrabajadoresOcupados.Count() > 0)
                {
                    mensaje = "ADVERTENCIA: Los siguientes trabajadores tienen\n más de 44 horas laborales asignadas:\n";
                    foreach (string nombre in idTrabajadoresOcupados)
                    {
                        mensaje += nombre + "\n";
                    }
                    MessageBox.Show(mensaje);
                }

                dataGridViewTrabajadoresHorasLibres.DataSource = resultado;
                dataGridViewTrabajadoresHorasLibres.Columns["IdTrabajador"].Visible = false;
                dataGridViewTrabajadoresHorasLibres.Columns["NombreCompleto"].HeaderText = "Nombre";
                dataGridViewTrabajadoresHorasLibres.Columns["NombreEspecializacion"].HeaderText = "Especialidad";
                dataGridViewTrabajadoresHorasLibres.Columns["Horas"].HeaderText = "Horas";
            }
        }

        private void LlenarDataGridHorasLibres(string consulta,List<string> vinculados)
        {
            string mensaje = "";
            DataTable resultado = acceso.EjecutarSelect(consulta);
            if (resultado == null)
            {
                mensaje = "Existen problemas en la conexión a la Base de Datos. No fue posible actualizar lista.";
                MessageBox.Show(mensaje);
            }
            else
            {
                List<string> idTrabajadoresOcupados = new List<string>();
                List<DataRow> filasABorrar = new List<DataRow>();
                foreach (DataRow row in resultado.Rows)
                {
                    if (Double.Parse(row["Horas"].ToString())<0)
                    {
                        idTrabajadoresOcupados.Add(row[1].ToString());
                        filasABorrar.Add(row);
                    }

                    if (vinculados!=null && vinculados.Contains(row["IdTrabajador"].ToString()))
                    {
                        if (!filasABorrar.Contains(row))
                        {
                            filasABorrar.Add(row);
                        }
                    }
                }
                foreach (DataRow row in filasABorrar)
                {
                    resultado.Rows.Remove(row);
                }
                if (idTrabajadoresOcupados.Count() > 0)
                {
                    mensaje = "ADVERTENCIA: Los siguientes trabajadores tienen\n más de 44 horas laborales asignadas:\n";
                    foreach(string nombre in idTrabajadoresOcupados)
                    {
                        mensaje += nombre + "\n";
                    }
                    MessageBox.Show(mensaje);
                }
                
                dataGridViewTrabajadoresHorasLibres.DataSource = resultado;
                dataGridViewTrabajadoresHorasLibres.Columns["IdTrabajador"].Visible = false;
                dataGridViewTrabajadoresHorasLibres.Columns["NombreCompleto"].HeaderText = "Nombre";
                dataGridViewTrabajadoresHorasLibres.Columns["NombreEspecializacion"].HeaderText = "Especialidad";
                dataGridViewTrabajadoresHorasLibres.Columns["Horas"].HeaderText = "Horas";
                
            }
        }

        private void CargarComboboxProyectos()
        {
            string mensaje = "";
            DataTable informacionProyectos = acceso.EjecutarSelect(Consultas.obtenerProyectosReducida());
            if (informacionProyectos == null)
            {
                mensaje = "Existen problemas en la conexión a la Base de Datos. No fue posible actualizar lista de Proyectos.";
                MessageBox.Show(mensaje);
            }
            else
            {
                comboBoxProyectos.DataSource = informacionProyectos;
                comboBoxProyectos.DisplayMember = "NombreProyecto";
                comboBoxProyectos.ValueMember = "IdProyecto";
                
            }
        }
        #endregion

       


       
        /// <summary>
        /// Ordena trabajadores segun los parametros seleccionados por el usuario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonOrdenarPorHoras_Click(object sender, EventArgs e)
        {
            List<string> parametros = new List<string>();
            if (checkedListBoxOpcionesOrdenar.CheckedIndices.Contains(0))
            {
                parametros.Add("NombreEspecializacion");
            }
            if (checkedListBoxOpcionesOrdenar.CheckedIndices.Contains(1))
            {
                parametros.Add("Horas");
            }
            

            string consulta = Consultas.HorasXTrabajador() + Consultas.AgregarOrden(parametros);
            int o;
            if (!Int32.TryParse(comboBoxProyectos.SelectedValue.ToString(), out o) || o == -1)
            {
                LlenarDataGridHorasLibres(consulta, null);
            }
            else
            {
                List<string> trabAsociados = acceso.EjecutarSelectL(Consultas.ObtenerEmpleadosVinculados(comboBoxProyectos.SelectedValue.ToString()));
                LlenarDataGridHorasLibres(consulta, trabAsociados);
            }
        }

        private void datagridHorasLibres_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && !primeraVisita)
            {
                int id=Int32.Parse(dataGridViewTrabajadoresHorasLibres["IdTrabajador", e.RowIndex].Value.ToString());
                if (!listaVinculacion.Contains(id))
                {
                    dataGridViewTrabajadoresHorasLibres.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightPink;
                    dataGridViewTrabajadoresHorasLibres.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Color.LightPink;
                    dataGridViewTrabajadoresHorasLibres.Rows[e.RowIndex].DefaultCellStyle.SelectionForeColor = Color.Black;

                    listaVinculacion.Add(id);
                    
                }
                else
                {
                    dataGridViewTrabajadoresHorasLibres.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
                    dataGridViewTrabajadoresHorasLibres.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Color.White;
                    dataGridViewTrabajadoresHorasLibres.Rows[e.RowIndex].DefaultCellStyle.SelectionForeColor = Color.Black;

                    listaVinculacion.Remove(id);
                    
                }
            }
            primeraVisita = false;
            dataGridViewTrabajadoresHorasLibres.ClearSelection();
        }

        private void buttonVincular_Click(object sender, EventArgs e)
        {
            if (comboBoxProyectos.SelectedItem == null)
            {
                MessageBox.Show("Debe seleccionar un proyecto para vincular trabajadores.");
                return;
            }
            else
            {
                //Vincular - Agregar filas a datagridviewTrabajadoresVinculados
                foreach (int id  in listaVinculacion)
                {
                                    
                    int ins = acceso.EjecutarInsertUpdateDelete(Consultas.InsertarTrabajadorProyectoHora(id.ToString(), comboBoxProyectos.SelectedValue.ToString(), "1"));
                    LlenarDataGridTrabajadoresVinculados(Int32.Parse(comboBoxProyectos.SelectedValue.ToString()));

                    List<string> trabAsociados = acceso.EjecutarSelectL(Consultas.ObtenerEmpleadosVinculados(comboBoxProyectos.SelectedValue.ToString()));
                    LlenarDataGridHorasLibres(Consultas.HorasXTrabajador(), trabAsociados);
                }
            }
        }

        private void LlenarDataGridTrabajadoresVinculados(int idProyecto)
        {
            string mensaje = "";
            DataTable resultado = acceso.EjecutarSelect(Consultas.HorasProyecto(idProyecto.ToString()));
            if (resultado == null)
            {
                mensaje = "Existen problemas en la conexión a la Base de Datos. No fue posible actualizar lista.";
                MessageBox.Show(mensaje);
            }
            else
            {
                List<string> nombreTrabajadoresExceso = new List<string>();
                
                foreach (DataRow row in resultado.Rows)
                {
                    if (44-Double.Parse(row["HorasTotales"].ToString()) < 0)
                    {
                        nombreTrabajadoresExceso.Add(row[1].ToString());
                    }
                }
                
                if (nombreTrabajadoresExceso.Count() > 0)
                {
                    mensaje = "ADVERTENCIA: Los siguientes trabajadores tienen\n más de 44 horas laborales totales asignadas:\n";
                    foreach (string nombre in nombreTrabajadoresExceso)
                    {
                        mensaje += nombre + "\n";
                    }
                    MessageBox.Show(mensaje);
                }

                dataGridViewTrabajadoresVinculados.DataSource = resultado;
                dataGridViewTrabajadoresVinculados.Columns["IdTrabajador"].Visible = false;
                dataGridViewTrabajadoresVinculados.Columns["NombreCompleto"].HeaderText = "Nombre";
                dataGridViewTrabajadoresVinculados.Columns["NombreEspecializacion"].HeaderText = "Especialidad";
                dataGridViewTrabajadoresVinculados.Columns["Horas"].HeaderText = "Horas";
                dataGridViewTrabajadoresVinculados.Columns["HorasTotales"].Visible = false;

            }
        }

        private void comboBoxProyectos_SelectedIndexChanged(object sender, EventArgs e)
        {
            string algo = comboBoxProyectos.SelectedValue.ToString();
            int o;
            if (!Int32.TryParse(comboBoxProyectos.SelectedValue.ToString(), out o) || o == -1)
            {
                dataGridViewTrabajadoresVinculados.Visible = false;
                return;
            }
            else
            {
                string consulta = Consultas.ObtenerEmpleadosVinculados(comboBoxProyectos.SelectedValue.ToString());
                List<string> trabAsociados = acceso.EjecutarSelectL(Consultas.ObtenerEmpleadosVinculados(comboBoxProyectos.SelectedValue.ToString()));
                LlenarDataGridHorasLibres(Consultas.HorasXTrabajador(), trabAsociados);

                LlenarDataGridTrabajadoresVinculados(Int32.Parse(comboBoxProyectos.SelectedValue.ToString()));
                dataGridViewTrabajadoresVinculados.Visible = true;
                listaDesvinculacion = new List<int>();
            }
            
        }

        private void dataGridViewTrabajadoresVinculados_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0 || e.ColumnIndex>0)
                return;
            else
            {
                idTrabajadorEditando = dataGridViewTrabajadoresVinculados["IdTrabajador", e.RowIndex].Value.ToString();
                filaEditando = e.RowIndex;
                labelEditarHoras.Visible = true;
                textBoxHoras.Visible = true;
                buttonAceptarHoras.Visible = true;
            }
        }

        private void buttonAceptarHoras_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(textBoxHoras.Text))
            {
                MessageBox.Show("No edito las horas del trabajador.");
            }
            else
            {
                dataGridViewTrabajadoresVinculados["Horas", filaEditando].Value = textBoxHoras.Text;
            }

            labelEditarHoras.Visible = false;
            textBoxHoras.Visible = false;
            buttonAceptarHoras.Visible = false;
        }

        private void buttonGuardarVinculacion_Click(object sender, EventArgs e)
        {
            int o;
            if (!Int32.TryParse(comboBoxProyectos.SelectedValue.ToString(), out o) || o == -1)
            {
                return;
            }
            else
            {
                string idProyecto = comboBoxProyectos.SelectedValue.ToString();
                string idTrabajador;
                string Horas;
                int inserciones = 0;
                int actualizaciones = 0;
                foreach (DataGridViewRow row in dataGridViewTrabajadoresVinculados.Rows)
                {
                    idTrabajador = row.Cells["IdTrabajador"].Value.ToString();
                    Horas = row.Cells["Horas"].Value.ToString();

                    List<string> existe = acceso.EjecutarSelectL(Consultas.ExisteTrabajadorProyectoHora(idTrabajador, idProyecto));
                    if (existe == null)
                    {
                        MessageBox.Show("No fue posible guardar la información. Existen problemas de conexión a la base de datos");
                    }
                    else
                    {
                        
                        if (existe.Count == 0)
                        {
                            //Insertar
                            int ins = acceso.EjecutarInsertUpdateDelete(Consultas.InsertarTrabajadorProyectoHora(idTrabajador, idProyecto, Horas));
                            if (ins > 0)
                                inserciones += ins;

                        }
                        else
                        {
                            //Actualizar
                            int act = acceso.EjecutarInsertUpdateDelete(Consultas.ActualizarTrabajadorProyectoHora(idTrabajador, idProyecto, Horas));
                            if (act > 0)
                                actualizaciones += act;
                        }
                    }
                }
                //Mensaje
                //MessageBox.Show("Se realizaron "+inserciones+" Inserciones y "+actualizaciones+" Actualizaciones.");
                LlenarDataGridTrabajadoresVinculados(Int32.Parse(comboBoxProyectos.SelectedValue.ToString()));

            }
        }

        private void dataGridTrabVinculados_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && !primeraVisitaVinc)
            {
                int id = Int32.Parse(dataGridViewTrabajadoresVinculados["IdTrabajador", e.RowIndex].Value.ToString());
                if (!listaDesvinculacion.Contains(id))
                {
                    dataGridViewTrabajadoresVinculados.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightPink;
                    dataGridViewTrabajadoresVinculados.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Color.LightPink;
                    dataGridViewTrabajadoresVinculados.Rows[e.RowIndex].DefaultCellStyle.SelectionForeColor = Color.Black;

                    listaDesvinculacion.Add(id);
                    
                }
                else
                {
                    dataGridViewTrabajadoresVinculados.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
                    dataGridViewTrabajadoresVinculados.Rows[e.RowIndex].DefaultCellStyle.SelectionBackColor = Color.White;
                    dataGridViewTrabajadoresVinculados.Rows[e.RowIndex].DefaultCellStyle.SelectionForeColor = Color.Black;

                    listaDesvinculacion.Remove(id);
                    
                }
            }
            primeraVisitaVinc = false;
            dataGridViewTrabajadoresVinculados.ClearSelection();
        }

        private void buttonDesvincular_Click(object sender, EventArgs e)
        {
            if (comboBoxProyectos.SelectedItem == null)
            {
                MessageBox.Show("Debe seleccionar un proyecto para desvincular trabajadores.");
                return;
            }
            else
            {
                //Vincular - Agregar filas a datagridviewTrabajadoresVinculados
                foreach (int id in listaDesvinculacion)
                {

                    int ins = acceso.EjecutarInsertUpdateDelete(Consultas.BorrarTrabajadorProyectoHora(id.ToString(), comboBoxProyectos.SelectedValue.ToString()));
                    LlenarDataGridTrabajadoresVinculados(Int32.Parse(comboBoxProyectos.SelectedValue.ToString()));

                    List<string> trabAsociados = acceso.EjecutarSelectL(Consultas.ObtenerEmpleadosVinculados(comboBoxProyectos.SelectedValue.ToString()));
                    LlenarDataGridHorasLibres(Consultas.HorasXTrabajador(), trabAsociados);
                }
            }
        }

        #region validar ingreso de horas
        private void textBoxHoras_KeyDown(object sender, KeyEventArgs e)
        {
           
            
            NoEsNumero = false;


            if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
            {
                

                if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
                {

                    if (e.KeyCode != Keys.Back && e.KeyCode!=Keys.Enter && e.KeyCode!=Keys.OemPeriod && e.KeyCode!=Keys.Oemcomma)
                    {
                        NoEsNumero = true;
                    }
                }
            }

            if (Control.ModifierKeys == Keys.Shift)
            {
                NoEsNumero = true;
            }
        
         
        }

        private void textBoxHoras_KeyPress(object sender, KeyPressEventArgs e)
        {
            TextBox text = (TextBox)sender;

            if (NoEsNumero == true)
            {

                MessageBox.Show("Favor Ingrese solo valores numéricos");
                e.Handled = true;
            }
            else
            {
                if (e.KeyChar == (char)Keys.Enter)
                {
                    SendKeys.Send("{TAB}");
                }
                
            }
        }
        #endregion





























    }
}















